.TITLE TTFP .IDENT /07.01/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; ; 09-FEB-78 PETER WANNHEDEN ; ; PREVIOUSLY MODIFIED BY: ; ; D. R. DONCHIN ; T. LEKAS ; J. KAUFFMAN ; S. C. ADAMS ; R. S. PHILPOTT ; B. S. MCCARTHY ; ; MODIFICATIONS ; ; ; S.C. ADAMS 27-FEB-86 07.00 ; SA454 -- FIX PROBLEMS WITH CONTINUATION LINES ; ; S.C. ADAMS 29-APR-86 07.01 ; SA457 -- ADD CONDITIONAL FOR BIC IN U.TST6 ; ; .MCALL EVNDF$,PKTDF$ PKTDF$ EVNDF$ .PSECT MAP5.6 ; ;+ ; MODULE TTFP - CONTAINS FORK LEVEL PROCESSING ROUTINES FOR THE ; FOLLOWING FORK REQUESTS: ; FR.SUI START OF UNSOLICITED INPUT ; FR.AST CHARACTER THAT CAUSES AST RECEIVED ; FR.SCA TERMINAL MANAGEMENT SWITCH CHARACTERS WERE STRUCK ; FR.ICS INPUT COUNT STATE TRANSITION OCCURRED ; FR.OOB OUT-OF-BAND CHARACTER WAS STRUCK ; ; ALL THESE ROUTINES ARE CALLED BY THE FORK DISPATCHER WITH: ; R4 POINTER TO UCBX (IF IT EXISTS) ; R5 POINTER TO U.TSTA ; S1.DSI 1 TO DISABLE INPUT PROCESSING ;- ; ; .SBTTL FPSUI - START OF UNSOLICITED INPUT. ; .ENABL LSB ; FPSUI:: CALL GCTAB ;GET CHARACTER THAT STARTS UNSOL. INPUT BCS 30$ ;NOT THERE ANY MORE - FORGET IT .IF DF T$$IDO TST $MCRPT ;IS THE MCR DISPATCHER INSTALLED? BEQ CTAST ;EQ NO - QUEUE THE AST TO C$CTEX .ENDC ;T$$IDO CMPB R2,#CH.SP ;IS IT A "FUNNY" CHARACTER (CONTROL ;CHARACTER OR SPACE)? BHI 10$ ;N - OK, JUMP CMPB R2,#CH.CR ;OF THE FUNNY CHARACTERS, WE ONLY ALLOW ;CARRIAGE RETURN AND CTRL-C TO START ;UNSOLICITED INPUT ;(CR WILL OF COURSE ALSO TERMINATE IT) BEQ 10$ ;CR - OK CMPB R2,#CH.CTC ;CTRL-C? BNE 50$ ;N - IGNORE 10$: ;REFERENCE LABEL .IF NDF T$$SPL CALL ALUCBX ;ALLOCATE UCBX BCS 50$ ;FAILED - JUMP .ENDC ;NDF T$$SPL CALL ALTB ;ALLOCATE AN INPUT BUFFER BCS 40$ ;FAILED - JUMP MOV R2,-(SP) ;OK - SAVE POINTER CLR -(SP) ;RESET CLI PROMPT STATUS FOR ^U/^R ASSUME U.TCI,0 MOV @R4,R3 ;GET CURRENT INPUT PACKET IF THERE IS ONE BEQ 20$ ;INPUT FREE - JUMP MOV #IS.CC,@R3 ;INPUT BUSY - SET STATUS = IS.CC ;(BY DEFINITION, IT MUST BE SOLICITED ;INPUT) MOVB @R3,1(SP) ;SHOW THAT A READ WAS INTERRUPTED BY A ^C MOV R4,-(SP) ;SAVE R4 CALL FPIRD ;SAY INPUT DONE MOV (SP)+,R4 ;RESTORE R4 20$: MOV (SP)+,U.TFPB(R4) ;SAVE ^U/^R STATUS IN NOW UNUSED OFFSET MOV (SP)+,U.TFIB(R4) ;SET UP POINTER TO FIRST INPUT BUFFER MOVB U.TCHP-U.TSTA(R5),U.TIHP(R4) ;SET UP INITIAL HOR. POS. .IF NE T$$UTO MOVB #T$$UTO,U.TITI(R4) ;INITIALIZE TIMER .ENDC ;T$$UTO ADD #U.TFIB,R4 ;POINT TO U.TFIB ; ; ;+ ; SUBROUTINE FPSUI1 - SET UP UCB FOR UNSOLICITED INPUT. ; FALL THROUGH FROM ABOVE OR CALLED FROM TTICH @ INT STATE ; ; INPUT: ; R4 POINTER TO U.TFIB ; R5 POINTER TO U.TSTA ; U.TFIB POINTER TO FIRST INPUT BUFFER ; ; OUTPUT: ; UCB SET UP. ; R2 POINTER TO SECOND WORD OF BUFFER. ; THIS WORD INITIALIZED TO 0. ; R4 POINTER TO U.TIC ; ; REGISTERS ALTERED: R2,R4 ;- ; ; FPSUI1::MOV @R4,R2 ;GET POINTER TO FIRST INPUT BUFFER ASSUME U.TTIC,U.TFIB-2 MOV #M$$CRB-4,-(R4) ;INITIALIZE TOTAL BYTE COUNT ; = 1 FULL CLI COMMAND BUFFER CALL NXTIB ;SET UP UCB FOR INPUT TRANSFER MOV R2,U.TCI-U.TIC(R4) ;STORE POINTER TO SECOND WORD IN BUFFER ;THIS WORD WILL RECEIVE COMPLETION STATUS CLR @R2 ;INITIALIZE STATUS BIS #S1.IBY!S1.IBF!S1.USI,@R5 ;SET FLAGS FOR UNSOLICITED ;BUFFERED INPUT BIC #S1.RST!S1.PTH!S1.RES!S1.RNF!S1.RSP!S1.TNE,@R5 BIC #S5.ITI,U.TST5-U.TSTA(R5) .IF DF T$$EIO BIC #S6.EIO,U.TST6-U.TSTA(R5) .ENDC ;T$$EIO MOV 4(R5),-(SP) ;GET CHARACTERISTIC WORD BIC #^C,(SP) ;GET RID OF EVERYTHING BUT TSY ASSUME S3.TSY,S1.TSY BIS (SP)+,(R5) ;RESTORE THE TSY BIT ACCORDING TO CHARACTERISTIC 30$: RETURN ; ; 40$: ; ; FAILED TO ALLOCATE INPUT BUFFER. WITH A LITTLE EFFORT, WE COULD ; DEALLOCATE THE UCBX, AFTER CHECKING WHETHER IT IS NEEDED FOR ; SOME OTHER PURPOSE. ; CALL BELL ;BUFFER ALLOCATION FAILURE ;OUTPUT A BELL AND 50$: CALLR RCTAB ;REMOVE CHARACTER FROM TYPE-AHEAD BUFFER ;AND FORGET IT ALL .PAGE .SBTTL FPAST - CHARACTER THAT CAUSES AST RECEIVED ; .IF DF T$$CCA FPAST:: CALL GCTAB ;GET A CHARACTER FROM THE TYPE-AHEAD BUFFER BCS 30$ ;NONE THERE - IGNORE .IF NDF T$$SPL TST R4 ;UCBX PRESENT? BEQ 30$ ;N - TERMINAL MUST BE DETACHED, IGNORE .ENDC ;NDF T$$SPL MOV U.TAST(R4),R1 ;GET AST BLOCK BEQ 30$ ;NONE - TERMINAL MUST BE DETACHED, IGNORE MOVB R2,A.PRM(R1) ;INSERT CHARACTER IN AST BLOCK BISB #AF.LCK,A.PRM+5(R1) ;ASSUME TASK ONLY WANTS NOTIFICATION... ;...SO LOCK THE AST CONTROL BLOCK CMPB R2,#CH.CTC ;IS CHARACTER A ^C? BNE 60$ ;N - JUMP MOV A.PRM+6(R1),R0 ;ASSUME SPECIFICATION OF ^C AST BNE 70$ ;GOOD ASSUMPTION - JUMP 60$: MOV A.PRM+10(R1),R0 ;GET ADDRESS OF UNSOLICITED AST ROUTINE BITB #TF.NOT,A.PRM+5(R1) ;TASK WANTS NOTIFICATION ONLY? BNE 80$ ;Y - JUMP 70$: CALL RCTAB ;REMOVE CHARACTER FROM TYPE-AHEAD BUFFER BICB #AF.LCK,A.PRM+5(R1) ;UNLOCK AST BLOCK 80$: MOV R0,A.AST(R1) ;INSERT TASK AST ADDRESS INTO AST BLOCK JMP QUEAEN ;QUEUE ASYNCHRONOUS EVENT NOTIFICATION .ENDC ;T$$CCA .PAGE .SBTTL FPSCA - SWITCH CHARACTERS HAVE BEEN DETECTED .IF DF T$$SCA ; ; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED RECOGNITION ; OF SWITCH CHARACTERS BY SETTING UP THE TC.SSC CHARACTERISTIC. ENTERING ; SWITCH CHARACTERS IS A REQUEST TO ENTER TERMINAL MANAGEMENT MODE. ; FPSCA:: .IF NDF T$$SPL TST R4 ;IS THERE A UCBX? BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHED .ENDC ;NDF T$$SPL TST U.TSCA(R4) ;IS THERE POINTER TO TERM MGMT ACB/TEP? BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUEST MOV #IS.TMM,R0 ;SET TMM STATUS CALL KILLI1 ;KILL INPUT MOV U.TSCA(R4),R1 ;GET POINTER TO TERM MGMT ACB/TEP JMP QUEAEN ;QUEUE TEP TO IT'S OWNER .ENDC ;T$$SCA .PAGE .SBTTL FPICS - INPUT COUNT STATE TRANSITION OCCURRED .IF DF T$$ICS ; ; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED NOTIFICATION ; OF THE TYPE-AHEAD BUFFER GOING FROM EMPTY TO NON-EMPTY BY SETTING UP ; THE TC.ICS CHARACTERISTIC. A TSA EVENT PACKET WILL BE QUEUED TO THE ; SYSTEM-STATE PROCESS THAT SET UP THE CHARACTERISTIC. ; FPICS:: CALL GCTAB ;IS THERE STILL A CHAR IN THE TAB? BCS 30$ ;IF CS, NO...FORGET THE REQUEST .IF NDF T$$SPL TST R4 ;IS THERE A UCBX? BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHED .ENDC ;NDF T$$SPL MOV U.TICA(R4),R1 ;GET POINTER TO ICS ACB/TEP BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUEST JMP QUEAEN ;QUEUE ACB TO IT'S OWNER .ENDC ;T$$ICS .PAGE .SBTTL FPOOB - OUT-OF-BAND CHARACTER DETECTED .IF DF T$$OOB ; ; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED NOTIFICATION ; OF INPUT OF OUT-OF-BAND CHARACTERS BY SETTING UP THE TC.OOB CHARACTERISTIC. ; IF THE USER IS A TASK, AN AST WILL BE QUEUED. OTHERWISE A TSA EVENT PACKET ; WILL BE QUEUED TO THE SYSTEM-STATE PROCESS THAT SET UP THE CHARACTERISTIC. ; FPOOB:: .IF NDF T$$SPL TST R4 ;IS THERE A UCBX? BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHED .ENDC ;NDF T$$SPL MOV U.TOBA(R4),R1 ;GET POINTER TO ICS ACB/TEP BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUEST CALL QUEAEN ;QUEUE TEP TO IT'S OWNER ASSUME U.TCI,0 ; ; CHECK IF A STATUS HAS BEEN SET. (IS.OOB). THIS MEANS THAT THE OOB ; CHARACTER WAS A CLEAR OOB AND THEREFORE, THE READ MUST BE TERMINATED. ; TST (R4)+ ;IS THERE INPUT? BEQ 30$ ;RETURN IF NOT. (IF NOT R4 NOT NEEDED) TST @-(R4) ;IS THERE STATUS? BEQ 30$ ;RETURN IF NOT CALLR KILLI ;TERMINATE THE READ .ENDC ;T$$OOB .DSABL LSB .PAGE .SBTTL CTAST - FOR INTERRUPT-DO SEND AN AST TO C$CTEX - FOR P/OS ; .IF DF T$$IDO ; ; THIS IS A HACK TO SEND AN AST TO A TASK CALLED C$CTEX WHEN ; ^C IS TYPED AND NO ONE WANT'S IT. THE AST ROUTINE IS ASSUMED ; TO BE AT LOCATION 250 ; ; ; SEE IF THE TASK IS INSTALLED ; CTAST: CMPB R2,#CH.CTC ;IS IT A CTRL-C? BEQ 970$ ;EQ YES - OK GO ON CRASH ;WE SHOULD ONLY GET HERE FOR ;A CTRL-C (OR INT-DO) 970$: CALL RCTAB ;GET RID OF THE CTRL-C MOV #CTEX,R3 ;GET CTEX'S NAME CALL $SRSTD ;LOOK FOR IT BCS 990$ ;IF CS - NOT HERE BIT #TS.EXE,T.STAT(R0) ;TASK ACTIVE? BNE 990$ ;IF NE NO - DON'T DO IT MOV R0,-(SP) ;SAVE THE TCB ADDRESS ; ; GET SOME POOL ; MOV #6.*2,R1 ;SIZE CALL $ALOCB ;GET IT BCS 980$ ;IF CS - NO POOL - FORGET IT ; ; FILL IN THE AST BLOCK ; MOV R0,R1 ;COPY BLOCK ADDRESS TST (R0)+ ;POINT PAST AST LIST LINK WORD MOV #6.*2,(R0)+ ;SIZE OF AST BLOCK MOV #7.*2,(R0)+ ;NUMBER OF BYTES TO ALLOCATE ON USER'S S MOV #250,(R0)+ ;AST VIRTUAL ADDRESS CLR (R0)+ ;NUMBER OF EXTRA WORDS TO PUT ON USER'S MOV (SP)+,R0 ;GET THE TCB ADDRESS CALLR $QASTT ;QUEUE THE AST AND THROW THE ^C AWAY 980$: TST (SP)+ ;CLEAN THE STACK 990$: RETURN .ENDC ;T$$IDO .PAGE .SBTTL FPKIL - SEND KILL PACKET TO CLI ; .IF DF T$$SPC .PSECT MAP6 FPKIL:: .IF DF C$$CTC BIT #UM.KIL,U.MUP-U.TSTA(R5) ;CREATE ^C NOTIFICATION PACKET IF CLR BNE 10$ ;IF NE, KILL PACKET MUST BE CREATED MOV #CC.CLI!CC.CTC,R1 ;SET ^C NOTIFICATION PACKET STATUS BR 20$ ;JUMP TO COMMON CODE 10$: .ENDC ;C$$CTC BIC #UM.KIL,U.MUP-U.TSTA(R5) ;CLEAR KILL BIT CLR U.TFPB(R4) ;RESET CLI PROMPT STATUS ; ; THE FOLLOWING CODE IS AN ATTEMPT TO CAUSE TTDRV TO CYCLE BACK ; THROUGH FPKIL SUCH THAT WHEN CONTROL C IS TYPED TO A CONTINUATION ; LINE, WE FIRST COME THROUGH AND KILL THE LINE THEN AGAIN TO ; ABORT TASKS. THIS BEHAVIOR IS BEING CHANGED AS IT IS INCONSISTENT ; WITH THE ACTION OF TTDRV WHEN A COMMAND LINE IS TERMINATED BY ^C. ; .IF DF T$$SPL ; ; MOVB #CH.CTC,U.TECO-U.TSTA(R5) ;PUT ^C IN ECHO BUFFER ; ; .IFF ;T$$SPL ; ; MOVB #CH.CTC,U.TECB(R4) ;PUT ^C IN ECHO BUFFER ; ; .ENDC ;T$$SPL ; ; FRKBIT BIS,#FR.PFP ; POST-FORK PROCESS A ^C ; MOV #CC.KIL,R1 ;SET CLI KILL STATUS 20$: MOV R5,R2 ;GET UCB ADDRESS SUB #U.TSTA,R2 ; CALL $QCNTP ;QUEUE CONTROL PACKET TO CLI RETURN .ENDC ;T$$SPC .PAGE .SBTTL QUEAEN - QUEUE ASYNCHRONOUS EVENT NOTIFICATION .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB ; ;+ ; ; **-QUEAEN - QUEUE ASYNCHRONOUS EVENT NOTIFICATION ; ; INPUTS: ; R1 => AST CONTROL BLOCK OR TSA EVENT PACKET TO BE QUEUED ; R4 => UCBX (MUST EXIST AND BE MAPPED) ; R5 => U.TSTA OF CURRENT UCBX ; ; OUTPUTS: ; R0 IS DESTROYED ; R3 IS DESTROYED IF A TEP IS PASSED IN R1 ; ;- ; .ENABL LSB QUEAEN:: .IF DF R$$IIC ASSUME A.CBL,E.VSIZ TST A.CBL(R1) ;IS THIS AN AST CONTROL BLOCK? BNE 10$ ;IF NE, NO...MUST BE A TEP .IFTF ;R$$IIC BITB #AF.QUE,A.PRM+5(R1) ;IS THIS ACB ALREADY QUEUED? BNE 20$ ;IF NE, YES...JUST RETURN .IF DF T$$OOB BITB #AF.OOB,A.PRM+5(R1) ;IS THIS ACB FOR OOB? BEQ 5$ ;IF EQ, NO TSTB A.PRM+24(R1) ;IS THERE A CHARACTER IN THE OOB BUFFER? BEQ 20$ ;IF EQ, NO... RETURN CALL RCBUF ;GET THE CHARACTER MOVB R2,A.PRM(R1) ;AND PUT IT IN THE ACB 5$: .ENDC ;T$$OOB BISB #AF.QUE,A.PRM+5(R1) ;MARK ACB AS QUEUED MOV U.ATT-U.TSTA(R5),R0 ;GET TCB OF ATTACHED TASK CALLR $QASTT ;QUEUE THE AST TO THE TASK .IFT ;R$$IIC 10$: MOV R1,R3 ;COPY TEP POINTER FOR QUEUE ROUTINE ; BR QUETEP ;SKIP TO QUEUE A TEP .SBTTL QUETEP - QUEUE TERMINAL EVENT PACKET TO OWNER ; ;+ ; ; **-QUETEP - THIS ROUTINE IS CALLED TO PASS A TSA EVENT PACKET TO A ROUTINE ; SET UP TO PROCESS THE EVENT. THE DOUBLEWORD ADDRESS OF THE ROUTINE ; TO BE CALLED IS EXPECTED TO BE IN THE TEP. NOTE THAT AN INTERLOCK ; MECHANISM IS PROVIDED TO DISABLE A FUTURE CALL WITH THE SAME PACKET ; IF NECESSARY. IT IS UP TO THE CALLED ROUTINE TO CLEAR THE INTERLOCK. ; ; INPUT: ; R3 => TEP TO PASS TO ITS OWNER ; ;- ; QUETEP:: BIT #EF.QUE,E.VFLG(R3) ;IS THE PACKET ALREADY QUEUED BNE 20$ ;IF NE, YES...CANNOT QUEUE A LOCKED PACKET BIS #EF.QUE,E.VFLG(R3) ;LOCK PACKET UNTIL OWNER IS DONE WITH IT MOV E.VAPR(R3),-(SP) ;SAVE DOUBLEWORD ADDRESS OF THE PACKET... MOV E.VADR(R3),-(SP) ;...OWNER ROUTINE CALL $MPPRO ;MAP AND CALL THE OWNER .ENDC ;R$$IIC 20$: RETURN ;ALL DONE .DSABL LSB .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB .SBTTL RCBUF - REMOVE CHARACTER FROM TYPE-AHEAD BUFFER ; ;+ ; ; **-RCBUF - THIS ROUTINE IS CALLED TO REMOVE A CHARACTER FROM A STANDARD ; FORMAT TYPE-AHEAD BUFFER. NOTE: THIS MUST BE CALLED ONLY ; WHEN IT IS KNOWN THAT THERE ARE CHARACTERS TO BE RETRIEVED! ; ; INPUT: ; R1 => ACB IN WHICH TYPE-AHEAD BUFFER RESIDES ; OUTPUT: ; R2 CHARACTER THAT WAS RETRIEVED ; ;- ; .IF DF T$$OOB RCBUF: CALL LOCKI ;LOCK OUT INTERRUPTS MOV R1,R3 ;;;MAKE COPY OF ACB ADDRESS TO PLAY WITH ADD #A.PRM+23,R3 ;;;POINT TO RETRIEVAL POINTER CLR R2 ;;;PREPARE FOR BYTE TRANSFER BISB (R3),R2 ;;;GET OFFSET TO RETRIEVE CHARACTER INCB (R3) ;;;INCREMENT RETR. POINTER CMPB (R3)+,1(R3) ;;;IS THE POINTER NOW = TOTAL BUFFER SIZE? BNE 10$ ;;;NE- OK CLRB -1(R3) ;;;START AT BEGINNING NEXT TIME 10$: DECB (R3)+ ;;;DEC CHARACTER COUNT ADD R2,R3 ;;;POINT TO... INC R3 ;;;THE CHARACTER CLR R2 ;;;GET READY FOR IT BISB (R3),R2 ;;;GET CHARACTER IN R2 RETURN .ENDC ;T$$OOB ; ; .END